var publisher = {//出版商
            subscribers:{//不同杂志的订阅者数组
                any : [] 
            },
            // 添加订阅这方法
            subscribe:function(fn,type){//订阅是触发的方法和订阅哪个类型的
                type = type || 'any';
                if(typeof this.subscribers[type] === 'undefined'){//如果这个订阅类型没有,就新创建一个
                    this.subscribers[type] = [];
                }
                this.subscribers[type].push(fn);//如果已经存在了,就把订阅触发的方法加到订阅数组里面
            },
            // 删除订阅者
            unsubscribe : function(fn,type){
                this.visitSubscribers('unsubscribe',fn,type);
            },
            // 出版 只有发布者才能出版
            publish : function(publication,type){
                this.visitSubscribers('publish',publication,type);
            },
            //处理删除或者出版的方法
            visitSubscribers : function(action,arg,type){
                var pubtype = type || 'any', //调用哪个订阅者库
                    subscribers = this.subscribers[pubtype],//
                    i,
                    max = subscribers.length;
                    console.log(subscribers)

                    for(i=0;i<max;i++){
                        if(action === 'publish'){//如果是出版的话
                            subscribers[i](arg);
                        }else{
                            if(subscribers[i] === arg){//如果是取消订阅的话
                                subscribers.splice(i,1);
                            }
                        }
                    }

            }
    }
    // 成为发布商
    function makePublisher(o){
        var i;
        for(i in publisher){
            if(publisher.hasOwnProperty(i) && typeof publisher[i] === 'function'){
                o[i] = publisher[i];
            }
        }
        o.subscribers = {
            any : []
        }
    }

    var paper = {
        daily : function(){
            this.publish('paper发行的日刊');
        },
        monthly : function(){
            this.publish('paper发行的月刊','monthly');
        }
    };
    makePublisher(paper); //一个发布者

    var joe = {
        drinkCoffee : function(paper){
            console.log('我读的是' + paper);
        },
        sundayPreNap : function(monthly){
            console.log('我读的是' + monthly);
        }
    }

    paper.subscribe(joe.drinkCoffee);
    paper.subscribe(joe.sundayPreNap,'monthly');

    paper.daily();
    paper.daily();
    paper.daily();
    paper.monthly();

zasqw2222
132 声望2 粉丝

苦苦的慢慢的爬行!